/*
 * Ejercicio realizado por Francisco Gonzalez-Armijo Riádigos
 * para la prueba de seleccion de http://www.nomasystems.es
 */

package es.kuassivi.android.cd.tests;

import android.content.pm.PackageManager;
import android.os.Binder;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import es.kuassivi.android.cd.MainActivity;
import es.kuassivi.android.cd.R;

/**
 * Test para la clase MainActivity
 * El test no mostrara el salto a otro Activity, 
 * Para ejecutar todos los test ver {@link AllTests}
 * 
 * @author kuassivi <a href="mailto:kuassivi@gmail.com">kuassivi@gmail.com</a>
 * @since 0.1
 */
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> 
{

    private MainActivity mActivity;
    public ListView mCompaniesListView;
    public View mView;
    public ListAdapter adapters;
    
	/**
     * Crea un test {@link android.test.ActivityInstrumentationTestCase2} 
     * que prueba la clase {@link MainActivity} activity.
     */
	public MainActivityTest() 
	{
		super("es.kuassivi.android.cd", MainActivity.class);
	}

    @Override
    protected void setUp() throws Exception 
    {
        super.setUp();
        
        setActivityInitialTouchMode(false);
        
        mActivity = getActivity();

        mCompaniesListView = (ListView) mActivity.findViewById(R.id.companyList);
    }
    
    /**
     * Comprobamos que existe la vista del listado de compañias
     * A su vez asumimos que el test fallará si no se superan las pre-condiciones
     */
    @MediumTest
    public void testPreconditions() 
    {
        assertNotNull(getActivity());
        assertNotNull(mCompaniesListView);
    }
    
    /**
     * Solo vamos a comprobar que se obtienen los elementos Company de la peticion REST
     */
    @SmallTest
    public void testPopulateCompaniesList()
    {
        getInstrumentation().callActivityOnStart(mActivity);
        getInstrumentation().callActivityOnResume(mActivity);
        
    	mActivity.runOnUiThread(new Runnable() {
	  		  @Override
	  		  public void run() {
			    	// Utilizamos el adptador que ya esta cargado en el Activity,
			    	// obtenemos sus elementos {Company}
			        adapters = mCompaniesListView.getAdapter();
    		  }
    		});
    	
    	getInstrumentation().waitForIdleSync();
    	
    	int childs = adapters.getCount();
    	// Comprobamos que nos devuelve solo 2 elementos
    	// Ojo! este test es especifico para el ejercicio realizado para nomasystems
        // segun el resultado obtenido de la peticion REST
    	assertEquals(2, childs);
    }
    
    /**
     * Comprobamos que el Activity actual puede llamar a otros Activities mediante click
     * de algun elemento del listado de compañias
     */
    @MediumTest
    public void testSubLaunch() 
    {
        getInstrumentation().callActivityOnStart(mActivity);
        getInstrumentation().callActivityOnResume(mActivity);
        
    	mActivity.runOnUiThread(new Runnable() {
    		  @Override
    		  public void run() {
					int firstPosition = mCompaniesListView.getFirstVisiblePosition() 
											- mCompaniesListView.getHeaderViewsCount();
					
					// comprobamos si al hacer click, se inicializa otro Activity y finaliza el actual
					mView = mCompaniesListView.getChildAt(firstPosition);
					
					mView.requestFocus();
					
					mView.performClick();
    		  }
    		});
    	
    	getInstrumentation().waitForIdleSync();
    	
    	assertTrue(mView.isFocused());
    }
    
    /**
     * Ciclo de vida del Activity
     */
    @MediumTest
    public void testLifeCycleCreate() 
    {
        // Lanzado onCreate()
    	
        getInstrumentation().callActivityOnStart(mActivity);
        getInstrumentation().callActivityOnResume(mActivity);
        
        // En este punto verificamos que se diponen de los permisos de conexion a internet
        
        int pid = Binder.getCallingPid();
        int uid = Binder.getCallingUid();
        
        int checkPermission = mActivity.checkPermission("android.permission.INTERNET", pid, uid);
        
        assertEquals("Permisos de Internet no definidos", 
        					PackageManager.PERMISSION_GRANTED, checkPermission);
        
        getInstrumentation().callActivityOnPause(mActivity);
        getInstrumentation().callActivityOnStop(mActivity);
        
        // El Activity no ha finalizado

        boolean isFinish = mActivity.isFinishing();
        assertFalse(isFinish);

        // La llamada ActivityUnitTestCase.tearDown() se realiza automaticamente
    }

}
